<html>
<head>
<title>Vim doc: user_02</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
p {
	text-indent: 2em;
}
p.upper {
	font-weight: bold;
}
dt {
	font-weight: bold;
}
</style>
</head>
<body>

<h2>2 使用Vim的第一步</h2>

<p>
本章提供的信息刚好够你用Vim编辑文件。虽然不够漂亮也不够快，但你能编辑。花点时间好好练习一下这些命令，它们是你后续学习的基础。
</p>

<h3>2.1 第一次运行VIm</h3>

<p>
要启动Vim，输入如下命令：
</p>

<pre class="shell">
	gvim file.txt
</pre>

<p>
在UNIX下你可以在任何命令提示界面输入这条命令。如果你运行的是Microsoft Windows，打开一个MS-DOS提示窗口然后在输入这条命令。
</p>

<p>
不管哪种情况，Vim都开始编辑一个名为file.txt的文件。因为这是一个新文件，你得到的是一个空白窗口。你的屏幕看起来会像这样：

<pre class="screen">
	+--------------------------------------+
	|#                                     |
	|~                                     |
	|~                                     |
	|~                                     |
	|~                                     |
	|~                                     |
	|"file.txt" [New file]                 |
	+--------------------------------------+
	（'#'是光标位置）
</pre>

</p>

<p>
~行表明该行并不存在于文件中。也就是说，当Vim把文件显示完了后，它就会显示~行。在屏幕的底部，一个消息行指示说该文件名为file.txt，并且显示出你正在创建一个新文件。消息信息是临时性的，其它信息可能会覆盖它。
</p>

<p class="upper">Vim命令</p>

<p>
gvim命令会创建一个窗口。如果你使用这个命令：

<pre class="shell">
	vim file.txt
</pre>

你会直接在命令窗口进行编辑。也就是说，如果你用的xterm，编辑行为就发生在xterm窗口。如果你使用的MS-DOS窗口，编辑行为就发生在MS-DOS窗口。不管是vim还是gvim，窗口中的文字看起来都是一样的，但gvim提供了一些额外的特性，比如菜单栏。后面还会有更多的介绍。
</p>

<h3>2.2 插入文字</h3>

<p>
Vim编辑器是一种模态编辑器。那意味着编辑器的行为是不一样的，取决于你在哪种模式下。两种基本的模式是正常模式和插入模式。在正常模式下你输入的字符是命令。在插入模式下你输入字符会被作为文字插入。
</p>

<p>
Vim一启动就会进入正常模式。要进入插入模式你需要输入'i'命令（i是插入的意思）。这样你就可以输入文字了。这些文字会被插入到文件。如果敲错了也不用担心；后面你会有机会更正。要输入下面的打油诗，你需要输入：

<pre class="vim">
	iA very intelligent turtle
	Found programming UNIX a hurdle
</pre>

在打完turtle后，你输入&lt;Enter&gt;另起一行。最后你输入&lt;Esc&gt;停止插入模式回到正常模式。现在你的Vim窗口中就会有这样两行：

<pre class="screen">
	+--------------------------------------+
	|A very intelligent turtle             |
	|Found programming UNIX a hurdle       |
	|~                                     |
	|~                                     |
	|~                                     |
	|~                                     |
	|                                      |
	+--------------------------------------+
</pre>

</p>

<p class="upper">这是什么模式？</p>

<p>
要看你在什么模式下，输入这表命令：

<pre>
	:set showmode
</pre>

你会注意到输入冒号时，Vim把光标移到了窗口的最后一行。那是你输入冒号命令（以冒号开头的命令）的地方。输入完命令后按&lt;Enter&gt;（所有冒号命令都是这样完成的）。
</p>

<p>
现在，如果你输入'i'命令Vim会在窗口的底部显示--INSERT--。从而指示你正处于插入模式。
<pre>
	+--------------------------------------+
	|A very intelligent turtle             |
	|Found programming UNIX a hurdle       |
	|~                                     |
	|~                                     |
	|~                                     |
	|~                                     |
	|--INSERT--                            |
	+--------------------------------------+
</pre>
如果你按&lt;Esc&gt;回到正常模式，最后一行会变成空白。
</p>

<p class="upper">摆脱麻烦</p>

<p>
Vim初学者碰到的问题之一是模式混淆，常常是因为忘记了所处的模式或不小心敲入了切换模式的命令。不管所处的模式是什么，按&lt;Esc&gt;就可以回到正常模式。有时候你要按两次。如果Vim以蜂鸣作为回应，就表示你已经在正常模式了。
</p>

<h3>2.3 到处移动</h3>

<p>
你回到正常模式后，可以使用这些键到处移动：

<pre class="summary">
	h	左
	j	下
	k	上
	l	右
</pre>

咋一看，这些命令是随便选择的？毕竟，有谁听说过l表示右？但实际上，这些选择是非常合理的：移动光标是你在使用编辑器时干的最多的事情，而这些键正好在你的右手位置排成一排。也就是说，这些命令使得你可以很快速地按它们：

</p>

<dl><dd>
注意：你也能用箭头键移动光标。如果你真的这样做，你的编辑速度会慢下来，因为你的手必须在文本键和箭头键之间来回移动。考虑一下，你可能一个小时要做几百次这样的动作，这确实需要花点时间。另外，有些键盘不提供箭头键，或把它们放在一个不常见的位置；这样一来学习hjkl就有帮助了。
</dd></dl>

<p>
有一个可以记住这些命令的方法是h在左边，l在右边，而j是一个指向下的箭头。
</p>

<p>
学习这些命令的最好方法是使用它们。使用i命令插入一些文本行。然后使用hjkl到处移动，在某处插入一些文字。不要忘记使用&lt;Esc&gt;回到正常模式。vimtutor也是一个在做中学的很好的方法。
</p>

<h3>2.4 删除字符</h3>

<p>
要删除字符，把光标移到要删除的字符上面，然后按x。（这好像回到了打字机的时代，你要删除一些东西的时候，你就在它们上面打xxx。）把光标移到第一行的开始处，然后按七个x就可以删除"A very "。结果就像这样：

<pre>
	+--------------------------------------+
	|intelligent turtle                    |
	|Found programming UNIX a hurdle       |
	|~                                     |
	|~                                     |
	|~                                     |
	|~                                     |
	|                                      |
	+--------------------------------------+
</pre>
</p>

<p>
现在你能够插入一些文字了，例如：
<pre>
	iA young &lt;Esc&gt;
</pre>
开头是一个插入命令（i），输入文字A young，然后退出插入模式（&lt;Esc&gt;）。结果如下：
<pre>
	+--------------------------------------+
	|A yound intelligent turtle            |
	|Found programming UNIX a hurdle       |
	|~                                     |
	|~                                     |
	|~                                     |
	|~                                     |
	|                                      |
	+--------------------------------------+
</pre>
</p>

<p><strong>删除一行</strong></p>

<p>
要删除一行使用dd命令。后面一行将向上移动填补空隙：
<pre>
	+--------------------------------------+
	|Found programming UNIX a hurdle       |
	|~                                     |
	|~                                     |
	|~                                     |
	|~                                     |
	|                                      |
	+--------------------------------------+
</pre>
</p>

<p><strong>删除一个换行符</strong></p>

<p>
在Vim中你可以把两行合并起来，也就是说两者之间的换行符被删掉了。J命令可以完成这个工作。假设有这样两行：
<pre>
	A young intelligent
	turtle
</pre>
把光标移动到第一行，然后按J：
<pre>
	A young intelligent turtle
</pre>
</p>

<h3>撤销和重做</h3>

<p>
假设你删除得太多了。当然，你可以重新在打一遍，但有更简单的方法。u命令撤销上一次的编辑。考虑一下这个编辑动作：在用dd删除了第一行后，u可以把它弄回来。另外一个例子：把光标移动到第一行的A上：
<pre>
	A young intelligent turtle
</pre>
现在按xxxxxxx删除A young。结果如下：
<pre>
	intelligent turtle
</pre>
按u撤销最后一个删除。最后删除的是g，所以undo会回复那个字符。
<pre>
	g intelligent turtle
</pre>
下一个u命令回复倒数第二个删除的字符：
<pre>
	ng intelligent turtle
</pre>
再下一个帮你把u找回来，以此类推：
<pre>
	ung intelligent turtle
	oung intelligent turtle
	young intelligent turtle
	 young intelligent turtle
	A young intelligent turtle
</pre>
</p>

<dl><dd>
注意：如果你按了两次u，发现结果又变回去了，说明你的Vim配置是Vi兼容的。应该改成非兼容模式。本教材假定你用的Vim的方式。如果你更喜欢传统的vi方式，就应该小心教材中的一些小差别。
</dd></dl>

<p><strong>重做</strong></p>

<p>
如果你撤销太多次了，你可以反过来重做（CTRL-R）。也就是说它会撤销撤销。要看这个效果，按两次CTRL-R。字符A和空格又消失了：
<pre>
	young intelligent turtle
</pre>
有一个撤销命令的特殊版本，U（撤销行）命令。U命令撤销最后改动的行。这个命令按两次可以相互撤销：
<pre>
    A very intelligent turtle
      xxxx                      删除very
    A intelligent turtle
                  xxxxxx        删除turtle
    A intelligent
                                用U恢复行
    A very intelligent turtle
                                用u命令撤销U
    A intelligent
</pre>
U命令自己就是一个修改命令，u可以撤销它，CTRL-R可以重做它。这可能有点让人困惑。但不用担心，u和CTRL-R可以带你到你曾经到过的任何地方。
</p>

<h3>2.6 其它编辑命令</h3>

<p>
Vim有很多修改文本的命令。这里给出一些常用的。
</p>

<p><strong>追加</strong></p>

<p>
i命令在光标前面插入字符。这样很好；但是，如果想在一行的末尾添加文字该怎么办呢？所以你需要在光后的后面插入文字。这可以用a命令（追加）做到。
</p>

<p>
例如，把这一行
<pre>
	and that's not saying much for the turtle.
</pre>
改成
<pre>
	and that's not saying much for the turtle!!!
</pre>
需要把光标移动到行尾。然后按x删除句号。这时光标在turtle的字母e上。现在按：
<pre>
	a!!!&lt;Esc&gt;
</pre>
追加三个感叹号在turtle的字母e后面：
<pre>
	and that's not saying much for the turtle!!!
</pre>
</p>

<p><strong>开一个新行</strong></p>

<p>
o命令在光标所在行的后面开一个新行，并将Vim置于插入状态。这样你就可以直接输入新行的文本了。假设光标在第一行的某个位置：
<pre>
	A very intelligent turtle
	Found programming UNIX a hurdle
</pre>
如果你使用o命令，并且输入这些文本：
<pre>
	oThat liked using Vim&lt;Esc&gt;
</pre>
结果会是：
<pre>
	A very intelligent turtle
	That liked using Vim
	Found programming UNIX a hurdle
</pre>
O在光标所在行的上面新开一行。
</p>

<p><strong>使用倍数</strong></p>

<p>
假设你想向上移动九行。你可以按九次k，就像kkkkkkkkk，或者你可以使用9k。实际上你几乎可以在任何命令前面添加数字。在前面，其实你可以用3a!&lt;Esc&gt;。同理3x可以删除三个字符。倍数永远在其应用的命令前面。
</p>

<h3>2.7 退出</h3>

<p>
ZZ命令可以退出。这个命令先写文件，然后退出。
<dl><dd>
注意：不像很多别的编辑器，Vim不会自动生成备份文件。如果你按ZZ，那么你的修改就提交了，就不会再退回去了。你也可以配置Vim生成备份文件。
</dd></dl>
</p>

<p><strong>丢弃修改</strong></p>

<p>
有时候你做了一些修改，但突然意识到不改还更好些。不用担心；Vim还有一个丢弃修改然后退出的命令：
<pre>
	:q!
</pre>
不要忘记按&lt;Esc&gt;完成命令。
</p>

<p>
对于关注细节的朋友，这里解释一下，:进入命令行模式；q是命令，告诉编辑器退出；!强制执行。
</p>

<p>
需要强制执行是因为Vim不愿丢弃任何修改的。如果你仅使用:q，Vim会显示错误并拒绝退出：
<pre>
	E37：No write since last change(use ! to override)
</pre>
指定强制执行，就等于是告诉Vim，“我知道我干的事情看起来很蠢，但是成年人并且我确实要这么做。”
</p>

<p>
如果你不想退出，而是要继续在Vi中编辑：:e!命令会把文件的内容重新装载进来。
</p>

<h3>2.8 找到帮助</h3>

<p>
所有你需要知道的东西都可以在Vim帮助文件中找到。这条命令可以获得通用帮助信息：
<pre>
	:help
</pre>
你也可以使用第一个功能键&lt;F1&gt;。如果你的键盘有&lt;Help&gt;说不定也可以。
</p>

<p>
如果你不提供主题，:help会显示通用帮助信息窗口。Vim的设计者做了一件很聪明（也很懒）的事：帮助窗口就是一个普通的编辑窗口。你可以使用所有的移动命令在帮助信息中移动。要退出帮助窗口，使用和退出编辑器相同的命令ZZ。这只会关闭帮助窗口，不会退出Vim。
</p>

<p>
你阅读帮助文本的时候，你会发现一些文字是用竖杠括起来的。这表示超链接。如果你把光标放到上面，然后按CTRL-]，帮助系统会把你带到其所指定的主题。（其实用Vim的术语来说这些超链接叫标签。所以CTRL-]是跳到该文字所代表的标签的位置。）
</p>

<p>
跳了几次之后，你可能想跳回去。CTRL-T（弹出标签）把你带到前一个位置。CTRL-O（跳到更旧的位置，这里是字母o）在这里也工作得很好。
</p>


<p>
在帮助系统的顶部，有*help.txt*这样一个记号。星号之间的名字用于定义帮助系统中的tag。
</p>

<p>
要获得某个主题的帮助，使用：
<pre>
	:help {subject}
</pre>
例如，要获得关于x命令的帮助，就输入：
<pre>
	:help x
</pre>
想知道如何删除文字，就使用：
<pre>
	:help deleting
</pre>
要获得一个所有Vim命令的索引，使用：
<pre>
	:help index
</pre>
如果你想获得关于一个控制字符命令（例如CTRL-A）的帮助，你需要在前面加CTRL-
<pre>
	:help CTRL-A
</pre>
Vim有很多模式，缺省情况下帮助系统显示正常模式下的命令。例如，下面的命令显示正常模式下的CTRL-H命令：
<pre>
	:help CTRL-H
</pre>
要指定其它模式，使用一个模式前缀。如果你想要插入模式版的帮助，要使用i_。对CTRL-H就是：
<pre>
	:help i_CTRL-H
</pre>
当你启动Vim是，你能使用一些命令行参数。这些参数以-开头。比如说，想知道-t参数做什么，可以这么做：
<pre>
	:help -t
</pre>
Vim有很多选项可以让你配置和定制编辑器。如果你想知道关于选项的帮助，你需要将它括在单引号里。例如，想知道'number'是干什么的，可以：
<pre>
	:help 'number'
</pre>
模式前缀如下表所示：
<table border="2">
	<tr>
		<td>模式</td>
		<td>前缀</td>
		<td>范例</td>
	</tr>
	<tr>
		<td>正常模式命令</td>
		<td>(无需前缀)</td>
		<td>:help x</td>
	</tr>
	<tr>
		<td>可视模式命令</td>
		<td>v_</td>
		<td>:help v_u</td>
	</tr>
	<tr>
		<td>插入模式命令</td>
		<td>i_</td>
		<td>:help i_&lt;Esc&gt;</td>
	</tr>
	<tr>
		<td>命令行命令</td>
		<td>:</td>
		<td>:help :quit</td>
	</tr>
	<tr>
		<td>命令行编辑</td>
		<td>c_</td>
		<td>:help c_&lt;Del&gt;</td>
	</tr>
	<tr>
		<td>Vim命令参数</td>
		<td>-</td>
		<td>:help -r</td>
	</tr>
	<tr>
		<td>选项</td>
		<td>''</td>
		<td>:help 'textwidth'</td>
	</tr>
</table>
特殊的键放在尖括号中。想知道插入模式下向上的箭头的意思，可以：
<pre>
	:help i_&lt;Up&gt;
</pre>
如果你碰到了一个你不理解的错误，例如：
<pre>
	E37: No write since last change(use ! to override)
</pre>
你可以通过开头的错误ID获得帮助：
<pre>
	:help E37
</pre>
</p>

总结：
<dl>
	<dt>:help</dt>
	<dd>给你一个非常通用的帮助。</dd>

	<dt>:help user-toc.txt</dt>
	<dd>用户手册的目录。</dd>

	<dt>:help :subjecd</dt>
	<dd>获得ex命令subject的帮助。</dd>

	<dt>:help :help</dt>
	<dd>获得帮助的帮助。</dd>

	<dt>:help abc</dt>
	<dd>正常模式下的abc命令。</dd>

	<dt>:help CTRL-B</dt>
	<dd>正常模式下CTRL-B命令。</dd>

	<dt>:help i_abc</dt>
	<dt>:help i_CTRL-B</dt>
	<dd>插入模式下的命令。</dd>

	<dt>:help v_abc</dt>
	<dt>:help v_CTRL-B</dt>
	<dd>可视模式下的命令。</dd>

	<dt>:help c_abc</dt>
	<dt>:help c_CTRL-B</dt>
	<dd>命令行模式下的编辑命令。</dd>

	<dt>:help 'subject'</dt>
	<dd>subject选项。</dd>

	<dt>:help subect()</dt>
	<dd>subject函数。</dd>

	<dt>:help -subject</dt>
	<dd>subject参数。</dd>

	<dt>:help +subject</dt>
	<dd>编译期特性。</dd>

	<dt>:help EventName</dt>
	<dd>自动命令事件。</dd>

	<dt>:help digraphs.txt</dt>
	<dd>'digraph.txt'帮助文件的顶部。</dd>

	<dt>:help pattern&lt;Tab&gt;</dt>
	<dd>搜索以pattern开头的tag，&lt;Tab&gt;可以提示。</dd>

	<dt>:help pattern&lt;Ctrl-D&gt;</dt>
	<dd>搜索并列出所有以pattern开头的tag。</dd>

	<dt>:helpgrep pattern</dt>
	<dd>全文搜索pattern，并调到第一个匹配。下面的命令可以跳到其它匹配：
		<dl>
			<dt>:cn</dt>
			<dd>下一个匹配</dd>

			<dt>:cprev</dt>
			<dt>:cN</dt>
			<dd>上一个匹配</dd>

			<dt>:cfirst</dt>
			<dt>:clast</dt>
			<dd>第一个或最后一个匹配</dd>

			<dt>:copen</dt>
			<dt>:cclose</dt>
			<dd>
				打开或关闭quickfix窗口，按&lt;Enter&gt;可以跳到光标所在的项目。
			</dd>
		</dl>
	</dd>
<dl>

</body>
</html>
